﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EventPlanner.Models;
using System.Collections.ObjectModel;

namespace EventPlanner.Tests.Dependencias
{
    /* Clase para modelar la base de datos simulada de Event Plnanner */
    class FakeDbContext : IDbContext
    {
        public IQueryable<Evento> Eventos
        {
            get { return _map.Get<Evento>().AsQueryable(); }
            set { _map.Use<Evento>(value); }
        }

        public IQueryable<Contacto> Contactos
        {
            get { return _map.Get<Contacto>().AsQueryable(); }
            set { _map.Use<Contacto>(value); }
        }

        public IQueryable<Usuario> Usuarios
        {
            get { return _map.Get<Usuario>().AsQueryable(); }
            set { _map.Use<Usuario>(value); }
        }

        public static String UsuarioActual { get; set; }

        public int SaveChanges()
        {
            ChangesSaved = true;
            return 0;
        }

        public bool ChangesSaved { get; set; }


        public T Attach<T>(T entity) where T : class
        {
            _map.Get<T>().Add(entity);
            return entity;
        }

        public T Add<T>(T entity) where T : class
        {
            _map.Get<T>().Add(entity);
            return entity;
        }

        public T Find<T>(int num) where T : class
        {
            // falta hacer!
            return (_map.Get<T>().First());            
            // _map.Get<T>().Single(
        }

        public T Delete<T>(T entity) where T : class
        {
            _map.Get<T>().Remove(entity);
            return entity;
        }

        public void SetActualUser(String u)
        {
            UsuarioActual = u;
        }

        public String GetActualUser()
        {
            return (UsuarioActual);
        }

        SetMap _map = new SetMap();

        class SetMap : KeyedCollection<Type, object>
        {
            public HashSet<T> Use<T>(IEnumerable<T> sourceData)
            {
                var set = new HashSet<T>(sourceData);
                if (Contains(typeof(T)))
                {                    
                    Remove(typeof(T));
                }
                Add(set);
                return set;
            }

            public HashSet<T> Get<T>()
            {
                return this[typeof(T)] as HashSet<T>;
            }

            protected override Type GetKeyForItem(object item)
            {
                return item.GetType().GetGenericArguments().First();
            }
        }
    }
}
